<?php

class FileOp
{
    static function createDir($aimUrl)
    {
        $aimUrl = str_replace('', '/', $aimUrl);
        $aimDir = '';
        $arr = explode('/', $aimUrl);
        $result = true;
        foreach ($arr as $str) {
            $aimDir .= $str . '/';
            if (!file_exists($aimDir)) {
                $result = mkdir($aimDir);
            }
        }
        return $result;
    }

    static function createFile($aimUrl, $overWrite = false)
    {
        if (file_exists($aimUrl) && $overWrite == false) {
            return false;
        } elseif (file_exists($aimUrl) && $overWrite == true) {
            FileOp:: unlinkFile($aimUrl);
        }
        $aimDir = dirname($aimUrl);
        FileOp:: createDir($aimDir);
        touch($aimUrl);
        return true;
    }

    static function writeFile($aimUrl, $data)
    {
        if (!file_exists($aimUrl)) {
            FileOp::createFile($aimUrl);
        }

        if (!$fso = fopen($aimUrl, 'w')) {
            return false;
        }
        if (!flock($fso, LOCK_EX))    //LOCK_NB,排它型锁定
        {
            return false;
        }
        if (!fwrite($fso, $data))        //写入字节流,serialize写入其他格式
        {
            return false;
        }
        flock($fso, LOCK_UN);    //释放锁定
        fclose($fso);
        return true;
    }

    static function moveDir($oldDir, $aimDir, $overWrite = false)
    {
        $aimDir = str_replace('', '/', $aimDir);
        $aimDir = substr($aimDir, -1) == '/' ? $aimDir : $aimDir . '/';
        $oldDir = str_replace('', '/', $oldDir);
        $oldDir = substr($oldDir, -1) == '/' ? $oldDir : $oldDir . '/';
        if (!is_dir($oldDir)) {
            return false;
        }
        if (!file_exists($aimDir)) {
            FileOp:: createDir($aimDir);
        }
        @ $dirHandle = opendir($oldDir);
        if (!$dirHandle) {
            return false;
        }
        while (false !== ($file = readdir($dirHandle))) {
            if ($file == '.' || $file == '..') {
                continue;
            }
            if (!is_dir($oldDir . $file)) {
                FileOp:: moveFile($oldDir . $file, $aimDir . $file, $overWrite);
            } else {
                FileOp:: moveDir($oldDir . $file, $aimDir . $file, $overWrite);
            }
        }
        closedir($dirHandle);
        return rmdir($oldDir);
    }


    static function moveFile($fileUrl, $aimUrl, $overWrite = false)
    {
        if (!file_exists($fileUrl)) {
            return false;
        }
        if (file_exists($aimUrl) && $overWrite = false) {
            return false;
        } elseif (file_exists($aimUrl) && $overWrite = true) {
            FileOp:: unlinkFile($aimUrl);
        }
        $aimDir = dirname($aimUrl);
        FileOp:: createDir($aimDir);
        rename($fileUrl, $aimUrl);
        return true;
    }


    static function unlinkDir($aimDir)
    {
        $aimDir = str_replace('', '/', $aimDir);
        $aimDir = substr($aimDir, -1) == '/' ? $aimDir : $aimDir . '/';
        if (!is_dir($aimDir)) {
            return false;
        }
        $dirHandle = opendir($aimDir);
        while (false !== ($file = readdir($dirHandle))) {
            if ($file == '.' || $file == '..') {
                continue;
            }
            if (!is_dir($aimDir . $file)) {
                FileOp:: unlinkFile($aimDir . $file);
            } else {
                FileOp:: unlinkDir($aimDir . $file);
            }
        }
        closedir($dirHandle);
        return rmdir($aimDir);
    }


    static function unlinkFile($aimUrl)
    {
        if (file_exists($aimUrl)) {
            unlink($aimUrl);
            return true;
        } else {
            return false;
        }
    }


    static function copyDir($oldDir, $aimDir, $overWrite = false)
    {
        $aimDir = str_replace('', '/', $aimDir);
        $aimDir = substr($aimDir, -1) == '/' ? $aimDir : $aimDir . '/';
        $oldDir = str_replace('', '/', $oldDir);
        $oldDir = substr($oldDir, -1) == '/' ? $oldDir : $oldDir . '/';
        if (!is_dir($oldDir)) {
            return false;
        }
        if (!file_exists($aimDir)) {
            FileOp:: createDir($aimDir);
        }
        $dirHandle = opendir($oldDir);
        while (false !== ($file = readdir($dirHandle))) {
            if ($file == '.' || $file == '..') {
                continue;
            }
            if (!is_dir($oldDir . $file)) {
                FileOp:: copyFile($oldDir . $file, $aimDir . $file, $overWrite);
            } else {
                FileOp:: copyDir($oldDir . $file, $aimDir . $file, $overWrite);
            }
        }
        return closedir($dirHandle);
    }


    static function copyFile($fileUrl, $aimUrl, $overWrite = false)
    {
        if (!file_exists($fileUrl)) {
            return false;
        }
        if (file_exists($aimUrl) && $overWrite == false) {
            return false;
        } elseif (file_exists($aimUrl) && $overWrite == true) {
            FileOp:: unlinkFile($aimUrl);
        }
        $aimDir = dirname($aimUrl);
        FileOp:: createDir($aimDir);
        copy($fileUrl, $aimUrl);
        return true;
    }

    static function writeFileSave($dst_path, $tmp_path, $bk_path, $file_name, $content)
    {
        FileOp::writeFile($tmp_path . $file_name, $content);
        FileOp::moveFile($dst_path . $file_name, $bk_path . $file_name, true);
        FileOp::moveFile($tmp_path . $file_name, $dst_path . $file_name, true);
    }
}

?>